package com.lsl.learn.springcloud.cfgbean;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @ClassName ConfigBean
 * @Description TODO
 * @Author LSL
 * @Date 2019/8/17 13:16
 * @Version 1.0
 * @Email lsl.yx@foxmail.com
 **/
@Configuration // 配置
public class ConfigBean {

    /**
     * ribbon是一个软负载均衡的客户端组件，他可以和其他所需请求的客户端结合使用，比如和eureka结合。
     *
     *  ribbon 自带负载均衡算法：
     *  RoundRobinRule （轮询）
     *  RandomRule （随机）
     *  AvailabilityFilteringRule （先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，还有并发的连接数超过阈值的服务，然后对剩余服务列表按照轮询的策略访问）
     *  WeightedResponseTimeRule （根据平均响应时间计算所有服务的权重，响应时间快的服务权重越大，被选中的概率越高。刚启动时如果统计信息不足，则使用RoundRobinRule策略，等统计信息足够会自动切换到WeightedResponseTimeRule）
     *  RetryRule （先按照RoundRobinRule的策略获取服务，如果获取服务失败则在指定的时间内会进行重试，获取可用的服务）
     *  BestAvailableRule （会先过滤由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务）
     *  ZoneAvoidanceRule （默认规章，复合判断server所在区域的性能和server的可用性选择服务器）
     *
     */

    @Bean // 定义bean
    @LoadBalanced  // 开启负载均衡 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端的 负载均衡工具
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    @Bean
    public IRule myRule() {
        return new RandomRule(); // 目的，用我们选择的随机算法替代默认的轮询算法
//        return new RetryRule();
    }
}
